package cn.tqfeiyang.springplus.system.service.impl;

import cn.tqfeiyang.springplus.system.entity.ConfigEntity;
import cn.tqfeiyang.springplus.system.mapper.ConfigMapper;
import cn.tqfeiyang.springplus.system.service.ConfigService;
import cn.tqfeiyang.springplus.system.request.ConfigDTO;
import cn.tqfeiyang.springplus.system.response.ConfigVO;
import cn.tqfeiyang.springplus.system.request.ConfigSTO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.tqfeiyang.springplus.framework.conversion.ConversionService;
import cn.tqfeiyang.springplus.framework.exception.BusinessException;
import cn.tqfeiyang.springplus.framework.response.ResultCode;
import cn.tqfeiyang.springplus.framework.pagination.PageHelper;
import cn.tqfeiyang.springplus.framework.pagination.PageData;
import jakarta.annotation.Resource;
import org.springframework.util.Assert;

/**
 * 参数服务实现类
 *
 * @author tqfeiyang
 * @since 2024-08-08
 */
@Service
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, ConfigEntity> implements ConfigService {

    /**
     * 对象转换服务
     */
    @Resource
    private ConversionService conversionService;

    /**
     * 参数映射接口
     */
    @Resource
    private ConfigMapper configMapper;

    /**
     * 分页查询参数
     *
     * @param configSTO 查询数据
     * @return 参数列表
     */
    @Override
    public PageData<ConfigVO> selectConfigPage(ConfigSTO configSTO) {
        Assert.notNull(configSTO, "configSTO不能为空");
        PageHelper<ConfigEntity> pageHelper = new PageHelper<>(configSTO);
        return pageHelper.selectPage(configMapper, ConfigVO.class);
    }

    /**
     * 查询参数
     *
     * @param configId 参数id
     * @return 参数信息
     */
    @Override
    public ConfigVO selectConfigInfo(Long configId) {
        Assert.notNull(configId, "configId不能为空");
        ConfigEntity configEntity = checkConfigExists(configId);
        return conversionService.map(configEntity, ConfigVO.class);
    }

    /**
     * 新建参数
     *
     * @param configDTO 请求数据
     * @return 参数id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createConfig(ConfigDTO configDTO) {
        Assert.notNull(configDTO, "configDTO不能为空");
        ConfigEntity configEntity = conversionService.map(configDTO, ConfigEntity.class);
        if (configMapper.insert(configEntity) == 0) {
            throw new BusinessException(ResultCode.ENTITY_INSERT_ERROR);
        }
        return configEntity.getConfigId();
    }

    /**
     * 修改参数
     *
     * @param configId 参数id
     * @param configDTO 请求数据
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateConfig(Long configId, ConfigDTO configDTO) {
        Assert.notNull(configId, "configId不能为空");
        Assert.notNull(configDTO, "configDTO不能为空");
        ConfigEntity originalEntity = checkConfigExists(configId);
        ConfigEntity configEntity = conversionService.map(configDTO, ConfigEntity.class);
        configEntity.setConfigId(configId);
        configEntity.setVersion(originalEntity.getVersion());
        if (configMapper.updateById(configEntity) == 0) {
            throw new BusinessException(ResultCode.ENTITY_UPDATE_ERROR);
        }
    }

    /**
     * 删除参数
     *
     * @param configId 参数id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteConfig(Long configId) {
        Assert.notNull(configId, "configId不能为空");
        checkConfigExists(configId);
        if (configMapper.deleteById(configId) == 0) {
            throw new BusinessException(ResultCode.ENTITY_DELETE_ERROR);
        }
    }

    /**
     * 检查参数实体是否存在
     *
     * @param configId 参数id
     * @return 参数实体
     */
    protected ConfigEntity checkConfigExists(Long configId) {
        ConfigEntity configEntity = configMapper.selectById(configId);
        if (configEntity == null) {
            throw new BusinessException(ResultCode.ENTITY_NOT_EXISTS);
        }
        return configEntity;
    }

}
